package com.xiaoshuidi.cloud.module.member.repository;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.xiaoshuidi.cloud.framework.common.pojo.PageResult;
import com.xiaoshuidi.cloud.framework.mybatis.core.query.LambdaQueryWrapperX;
import com.xiaoshuidi.cloud.module.member.controller.admin.questionnaireinfo.vo.QuestionnaireInfoCreateVO;
import com.xiaoshuidi.cloud.module.member.controller.admin.questionnaireinfo.vo.QuestionnairePageRespVO;
import com.xiaoshuidi.cloud.module.member.controller.admin.questionnaireinfo.vo.QuestionnairePageVO;
import com.xiaoshuidi.cloud.module.member.enums.StatusEnum;
import com.xiaoshuidi.cloud.module.member.mapper.questionnaireinfo.MemberQuestionnaireInfoMapper;
import com.xiaoshuidi.cloud.module.member.pojo.questionnaireinfo.MemberQuestionnaireInfo;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;

import java.time.LocalDateTime;
import java.util.List;
import java.util.stream.Collectors;

@Repository
@RequiredArgsConstructor
public class MemberQuestionnaireInfoRepository extends ServiceImpl<MemberQuestionnaireInfoMapper, MemberQuestionnaireInfo> {
    private final MemberQuestionnaireInfoMapper mapper;

    public Long create(QuestionnaireInfoCreateVO vo) {
        MemberQuestionnaireInfo memberQuestionnaireInfo = new MemberQuestionnaireInfo();
        BeanUtils.copyProperties(vo, memberQuestionnaireInfo);
        memberQuestionnaireInfo.setIsPublished(false);
        mapper.insert(memberQuestionnaireInfo);
        return memberQuestionnaireInfo.getId();
    }

    public Boolean savePublishTime(Long questionnaireId) {
        MemberQuestionnaireInfo memberQuestionnaireInfo = new MemberQuestionnaireInfo();
        memberQuestionnaireInfo.setId(questionnaireId);
        memberQuestionnaireInfo.setPublishTime(LocalDateTime.now());
        memberQuestionnaireInfo.setIsPublished(true);
        mapper.updateById(memberQuestionnaireInfo);
        return true;
    }

    public PageResult<QuestionnairePageRespVO> getPage(QuestionnairePageVO pageVO) {
        LambdaQueryWrapperX<MemberQuestionnaireInfo> wrapperX = generatorWrapper(pageVO);
        PageResult<MemberQuestionnaireInfo> pageResult = mapper.selectPage(pageVO, wrapperX);
        List<QuestionnairePageRespVO> collect = pageResult.getList().stream().map(q -> {
            QuestionnairePageRespVO questionnairePageRespVO = new QuestionnairePageRespVO();
            BeanUtils.copyProperties(q, questionnairePageRespVO);
            //设置状态
            if (pageVO.getStatus() != null) {
                questionnairePageRespVO.setStatus(pageVO.getStatus());
            } else {
                questionnairePageRespVO.setStatus(getStatus(q));
            }
            return questionnairePageRespVO;
        }).collect(Collectors.toList());
        PageResult<QuestionnairePageRespVO> result = PageResult.empty();
        result.setList(collect);
        result.setTotal(pageResult.getTotal());
        return result;
    }

    public Integer getStatus(MemberQuestionnaireInfo q) {
        LocalDateTime now = LocalDateTime.now();
        //未生效 生效时间>当前时间
        if (q.getEffectTime().isAfter(now)) {
            return StatusEnum.NOT_EFFECTIVE.getCode();
        } else if ((q.getExpireTime().isAfter(now) && now.isAfter(q.getEffectTime())) || q.getEffectTime() == now) {
            //已生效 生效时间<=当前时间<过期时间
            return StatusEnum.EFFECTIVE.getCode();
        } else {
            return StatusEnum.EXPIRED.getCode();
        }
    }

    private LambdaQueryWrapperX<MemberQuestionnaireInfo> generatorWrapper(QuestionnairePageVO pageVO) {
        LambdaQueryWrapperX<MemberQuestionnaireInfo> wrapperX = new LambdaQueryWrapperX<MemberQuestionnaireInfo>()
                .geIfPresent(MemberQuestionnaireInfo::getPublishTime, pageVO.getBeginTime())
                .leIfPresent(MemberQuestionnaireInfo::getPublishTime, pageVO.getEndTime())
                .eqIfPresent(MemberQuestionnaireInfo::getRecyclingNum, pageVO.getRecyclingNum())
                .orderByDesc(MemberQuestionnaireInfo::getCreateTime);
        if (pageVO.getStatus() != null && pageVO.getStatus().intValue() == StatusEnum.NOT_EFFECTIVE.getCode().intValue()) {
            //未生效 生效时间>当前时间
            wrapperX.gt(MemberQuestionnaireInfo::getEffectTime, LocalDateTime.now());
        } else if (pageVO.getStatus() != null && pageVO.getStatus().intValue() == StatusEnum.EFFECTIVE.getCode().intValue()) {
            //已生效 生效时间<=当前时间<过期时间
            wrapperX.le(MemberQuestionnaireInfo::getEffectTime, LocalDateTime.now())
                    .gt(MemberQuestionnaireInfo::getExpireTime, LocalDateTime.now());
        } else if (pageVO.getStatus() != null && pageVO.getStatus().intValue() == StatusEnum.EXPIRED.getCode().intValue()) {
            //已失效   过期时间<=当前时间
            wrapperX.le(MemberQuestionnaireInfo::getExpireTime, LocalDateTime.now());
        }
        return wrapperX;
    }

    @Transactional(rollbackFor = Exception.class)
    public Boolean update(QuestionnaireInfoCreateVO vo) {
        MemberQuestionnaireInfo memberQuestionnaireInfo = new MemberQuestionnaireInfo();
        BeanUtils.copyProperties(vo, memberQuestionnaireInfo);
        memberQuestionnaireInfo.setIsPublished(false);
        mapper.updateById(memberQuestionnaireInfo);

        return true;
    }
}
